#ifndef CAMERA_CONTROL_HPP
#define CAMERA_CONTROL_HPP

#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#include <sys/time.h>
#include <opencv2/opencv.hpp>
#include <pthread.h>
#include <time.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#include "MvCameraControl.h"

#include <vector>
#include <cstdlib> // 用于 malloc 和 free
#include <vector>
#include <ctime> // 引入时间库
#include <mutex>
#include <condition_variable>




// 图像帧结构体
struct ImageFrame {
    std::shared_ptr<cv::Mat> mat;  // 使用 shared_ptr 管理 cv::Mat 对象的生命周期
    int frameNum;                  // 帧编号
    std::time_t timestamp;         // 时间戳
};


// 存储原始图像帧的共享资源结构体
struct FrameSharedResources {
    std::vector<ImageFrame> frames;          // 存储原始图像帧的向量
    std::mutex mutex;                         // 互斥锁
    std::condition_variable cond;             // 条件变量
    int maxFrames;                            // 向量最大长度
    bool newFrameAvailable;                   // 标记新帧是否可用
};

// 推理结果结构体
struct InferenceResult {
    std::shared_ptr<cv::Mat> mat;       // 存储推理后的图像数据
    int frameNum;                       // 帧编号
    std::time_t timestamp;              // 时间戳
    int predictedClass;                 // 预测类别
};

// 存储推理结果的共享资源结构体
struct InferenceSharedResources {
    std::vector<InferenceResult> infer_frame; // 存储推理结果的向量
    std::mutex mutex;                         // 互斥锁
    std::condition_variable cond;             // 结果
    bool newInferenceResultAvailable;         // 标记新推理结果是否可用
};

// SharedResourcesWrapper 结构体用于包装共享资源
struct SharedResourcesWrapper {
    FrameSharedResources* frameRes; // 指向原始图像帧共享资源的指针
    InferenceSharedResources* inferRes; // 指向推理结果共享资源的指针

    // 构造函数，用于初始化结构体成员
    SharedResourcesWrapper(FrameSharedResources* frameResource, InferenceSharedResources* inferenceResource)
        : frameRes(frameResource), inferRes(inferenceResource) {}
};

typedef struct {
    void* handle;
    FrameSharedResources* sharedResources;
} ThreadArgs;

// 函数声明
void InitSharedResources(SharedResourcesWrapper& sharedRes, int maxFrames);
void DestroySharedResources(FrameSharedResources* frameRes, InferenceSharedResources* inferRes);
void PressEnterToExit(void);
bool PrintDeviceInfo(MV_CC_DEVICE_INFO* pstMVDevInfo);
int InitializeCamera(void** handle);
void WaitForExit();
void Cleanup(void* handle, pthread_t nThreadID, SharedResourcesWrapper* sharedResWrapper);
void* DisplayThread(void* pUser);
void* WorkThread(void* args);


#endif // CAMERA_CONTROL_HPP
